CPU 上下文切换
CPU 上下文切换
上下文切换(Context Switch) 是操作系统中,当 CPU 在多个进程或线程之间切换执行时发生的操作。它是多任务系统实现并发执行的核心机制之一。
上下文 是指 CPU 运行一个进程或线程时的状态,包括以下内容:
- 寄存器:存储当前进程的运行状态(如指令指针、程序计数器、栈指针等)。
- 内存映射:包括进程的地址空间、虚拟内存页表等。
- CPU 状态:进程当前的运行模式(用户态或内核态)。
- 进程控制块(PCB):保存进程的上下文信息。
上下文切换的场景:
- 进程上下文切换:当操作系统调度器决定暂停一个进程并切换到另一个进程时,需要保存当前进程的上下文,并恢复目标进程的上下文。
- 线程上下文切换:线程属于同一个进程,但每个线程有自己独立的执行上下文(如寄存器状态、栈指针),切换时也会涉及上下文保存与恢复。
- 中断上下文处理:当硬件或软件中断发生时,CPU 会暂停当前进程处理中断,完成后恢复原进程的上下文。
上下文切换的步骤:
- 保存上下文:将当前进程/线程的寄存器、栈指针等信息保存到进程控制块(PCB)中。
- 加载新上下文:从目标进程的 PCB 中加载该进程的寄存器状态、栈指针等信息。
- 切换内存映射:切换虚拟内存的页表,以确保 CPU 访问的是新进程的内存空间。
上下文切换的开销: 上下文切换涉及保存和恢复进程状态、切换内存映射等操作,这需要 CPU 额外的时间。频繁的上下文切换会导致性能下降,因为每次切换时,CPU 需要停下来保存/加载状态,而不是执行有用的工作。因此,系统设计通常会尽量减少不必要的上下文切换。
1 进程上下文切换
调度的时机:
- 进程进行系统调用时,可能会发生系统调用时上下文调度
- 时间片耗尽
- 进程阻塞
- 优先级调度
- 中断
2 线程上下文切换
- 线程属于不同的进程
- 同进程上下文调度
- 线程间属于同一进程
- 共享相同的虚拟内存、全局变量等资源
- 切换栈、寄存器等线程私有数据
3 中断上下文切换
- 硬件&软件中断时
- 优先级比进程、线程优先级高
- 中断只需要内核态的状态,CPU 寄存器,内核堆栈,硬件中断参数等
4 CPU 上下文切换的问题
会将大量的CPU时间浪费保存和恢复程序状态上面,缩短真正的运行时间,导致系统整体性能大幅下降
5 查看CPU上下文切换
# CPU 上下文切换
vmstat 5
输出内容:
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
r b swpd free buff cache si so bi bo in cs us sy id wa st gu
1 0 0 3230412 44980 526092 0 0 5 8 49 0 0 0 99 0 0 0
内容含义查看:
vmstat(8) - Linux 手册页 --- vmstat(8) - Linux manual page: https://man7.org/linux/man-pages/man8/vmstat.8.html
重要字段:
- cs(context switch)是每秒上下文切换的次数。
- in(interrupt)则是每秒中断的次数。
- r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
- b(Blocked)则是处于不可中断睡眠状态的进程数。
pidstat -w 5
内容输出:
Linux 6.8.0-44-generic (dy-turbo-vm) 09/14/2024 _aarch64_ (2 CPU)
11:54:39 AM UID PID cswch/s nvcswch/s Command
11:54:44 AM 0 16 0.20 0.00 ksoftirqd/0
11:54:44 AM 0 17 0.40 0.00 rcu_preempt
11:54:44 AM 0 18 0.40 0.00 migration/0
11:54:44 AM 0 23 0.40 0.00 migration/1
11:54:44 AM 0 34 1.98 0.00 kcompactd0
11:54:44 AM 0 48 0.20 0.00 kworker/0:1H-kblockd
11:54:44 AM 0 470 1.39 0.00 multipathd
11:54:44 AM 0 712 10.69 0.00 vmtoolsd
11:54:44 AM 0 5892 3.17 0.00 kworker/0:1-events
11:54:44 AM 0 6488 1.98 0.00 kworker/u4:0-events_power_efficient
11:54:44 AM 0 6501 6.34 0.00 kworker/1:3-events
11:54:44 AM 0 6677 4.75 0.00 kworker/u4:2-events_unbound
11:54:44 AM 1000 6969 18.22 0.00 sshd
11:54:44 AM 1000 7085 0.20 0.00 pidstat
pidstat(1) - Linux manual page: https://man7.org/linux/man-pages/man1/pidstat.1.html
重要字段:
- cswch/s : 每秒自愿上下文切换次数(自愿:I/O等待,申请内存等需要等待资源ready的操作)
- nvcswch/s : 每秒非自愿上下文切换次数(非资源:时间片达到等)
本站总访问量次 本站访客数人次 本文总阅读量次